关于windows 在 Program Files (x86) 中,软件对该目录中的文件操作权限不够的解决方案

您所在的位置:网站首页 安装程序没有访问目录c:/program files的权限 关于windows 在 Program Files (x86) 中,软件对该目录中的文件操作权限不够的解决方案

关于windows 在 Program Files (x86) 中,软件对该目录中的文件操作权限不够的解决方案

2024-07-16 18:02| 来源: 网络整理| 查看: 265

方案一:

        把软件执行权限为管理员权限

添加 uac.manifest  文件, 内容如下

方案二:

        把软件的安装目录改为当前用户访问控制 或者 Everyone访问控制

如下, 在安装包安装安成后执行如下程序

#include #include #include #include #include #include int EnableFileAccountPrivilege(PCTSTR pszPath, PCTSTR pszAccount) { BOOL bSuccess = TRUE; EXPLICIT_ACCESS ea; PACL pNewDacl = NULL; PACL pOldDacl = NULL; do { // 获取文件 (夹) 安全对象的 DACL 列表 if (ERROR_SUCCESS != GetNamedSecurityInfo((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDacl, NULL, NULL)) { bSuccess = FALSE; break; } // 此处不可直接用 AddAccessAllowedAce 函数, 因为已有的 DACL 长度是固定, 必须重新创建一个 DACL 对象 // 生成指定用户帐户的访问控制信息(这里指定赋予全部的访问权限) ::BuildExplicitAccessWithName(&ea, (LPTSTR)pszAccount, GENERIC_ALL, GRANT_ACCESS, SUB_CONTAINERS_AND_OBJECTS_INHERIT); // 创建新的 ACL 对象(合并已有的 ACL 对象和刚生成的用户帐户访问控制信息) if (ERROR_SUCCESS != ::SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl)) { bSuccess = FALSE; break; } // 设置文件 (夹) 安全对象的 DACL 列表 if (ERROR_SUCCESS != ::SetNamedSecurityInfo((LPTSTR)pszPath, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL)) { bSuccess = FALSE; } } while (FALSE); if (NULL != pNewDacl) { ::LocalFree(pNewDacl); } return bSuccess; } int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPath path(__targv[0]); path.RemoveFileSpec(); if(__argc > 1) path.m_strPath = __targv[1]; if(path.IsRelative()) { CString strPWD; DWORD nSize = ::GetCurrentDirectory(0,NULL); ::GetCurrentDirectory(nSize,strPWD.GetBuffer(nSize+1)); strPWD.ReleaseBuffer(); CString strSub = path.m_strPath; path.m_strPath = strPWD; path.Append(strSub); } path.Canonicalize(); int retVal = 0; LPTSTR pszObjName = (LPTSTR)path.m_strPath.GetString(); // 获取当前登录用户的名称 wchar_t strBuffer[256] = { 0 }; DWORD dwSize = 256; GetUserName(strBuffer, &dwSize); const wchar_t z_wszAccountName[MAX_PATH] = L"Everyone"; if (!EnableFileAccountPrivilege(pszObjName, strBuffer)) { printf("change file account Privilege fail : %s", pszObjName); } return 0; }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3